//
//  UIImage+Extension.swift
//  Blockfolio
//
//  Created by Maybe on 09/05/2021.
//

import UIKit

extension UIImage {
    
    func changeColor(_ tintColor: UIColor, blendMode: CGBlendMode) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.size, false, 0.0)
        tintColor.setFill()
        let bounds = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
        UIRectFill(bounds)
        self.draw(in: bounds, blendMode: blendMode, alpha: 1.0)
        if blendMode != .destinationIn {
            self.draw(in: bounds, blendMode: .destinationIn, alpha: 1.0)
        }
        
        let tintedImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return tintedImage ?? UIImage()
    }
    
    /// 颜色转图片
    ///
    /// - Parameter color: 颜色
    /// - Returns: 图片
    class func color(color: UIColor) -> UIImage {
        let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        context?.setFillColor(color.cgColor)
        context?.fill(rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image!
    }
    
    /*
     指定宽度等比缩放
     
     - parameter newWidth: 需要缩放的宽度
     
     - returns: 返回缩放后的图片
     */
    func equalScaleWithWidth(_ newWidth: CGFloat) -> CGSize {
        // 新的高度 / 新的宽度 = 原来的高度 / 原来的宽度
        let newHeight = newWidth * (size.height * scale) / (size.width * scale)
        let newSize = CGSize(width: newWidth, height: newHeight)
        return newSize
    }
    
    /**
     指定高度等比缩放
     
     - parameter newHeight: 需要缩放的高度
     
     - returns: 返回缩放后的图片
     */
    func equalScaleWithWHeight(_ newHeight: CGFloat) -> CGSize {
        // 新的高度 / 新的宽度 = 原来的高度 / 原来的宽度
        let newWidth = newHeight / (size.height * scale) * (size.width * scale)
        let newSize = CGSize(width: newWidth, height: newHeight)
        return newSize
    }
    
    /**
     缩放图片到指定的尺寸
     
     - parameter newSize: 需要缩放的尺寸
     
     - returns: 返回缩放后的图片
     */
    func resizeImageWithNewSize(_ newSize: CGSize) -> UIImage {
        
        var rect = CGRect.zero
        let oldSize = self.size
        
        if newSize.width / newSize.height > oldSize.width / oldSize.height {
            rect.size.width = newSize.height * oldSize.width / oldSize.height
            rect.size.height = newSize.height
            rect.origin.x = (newSize.width - rect.size.width) * 0.5
            rect.origin.y = 0
        } else {
            rect.size.width = newSize.width
            rect.size.height = newSize.width * oldSize.height / oldSize.width
            rect.origin.x = 0
            rect.origin.y = (newSize.height - rect.size.height) * 0.5
        }
        
        UIGraphicsBeginImageContextWithOptions(newSize, true, 0)
        let context = UIGraphicsGetCurrentContext()
        context?.setFillColor(UIColor.clear.cgColor)
        UIRectFill(CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
        self.draw(in: rect)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        return newImage!
    }
    
    /// 重新绘制图片
    ///
    /// - Parameters:
    ///   - image: 原图
    ///   - size: 绘制尺寸
    /// - Returns: 新图
    func redrawImage(size: CGSize?) -> UIImage? {
        
        // 绘制区域
        let rect = CGRect(origin: CGPoint(), size: size ?? CGSize.zero)
        
        // 开启图形上下文 size:绘图的尺寸 opaque:不透明 scale:屏幕分辨率系数,0会选择当前设备的屏幕分辨率系数
        UIGraphicsBeginImageContextWithOptions(rect.size, true, 0)
        
        // 绘制 在指定区域拉伸并绘制
        draw(in: rect)
        
        // 从图形上下文获取图片
        let result = UIGraphicsGetImageFromCurrentImageContext()
        
        // 关闭上下文
        UIGraphicsEndImageContext()
        
        return result
    }
    
    /// 重新绘制圆形图片
    ///
    /// - Parameters:
    ///   - image: 原图
    ///   - size: 绘制尺寸
    ///   - bgColor: 裁剪区域外的背景颜色
    /// - Returns: 新图
    func redrawOvalImage(size: CGSize?, bgColor: UIColor?) -> UIImage? {
        
        // 绘制区域
        let rect = CGRect(origin: CGPoint(), size: size ?? CGSize.zero)
        
        // 开启图形上下文 size:绘图的尺寸 opaque:不透明 scale:屏幕分辨率系数,0会选择当前设备的屏幕分辨率系数
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
        
        // 背景颜色填充
        bgColor?.setFill()
        UIRectFill(rect)
        
        // 圆形路径
        let path = UIBezierPath(ovalIn: rect)
        
        // 进行路径裁切，后续的绘图都会出现在这个圆形路径内部
        path.addClip()
        
        // 绘制图像 在指定区域拉伸并绘制
        draw(in: rect)
        
        // 从图形上下文获取图片
        let result = UIGraphicsGetImageFromCurrentImageContext()
        
        // 关闭上下文
        UIGraphicsEndImageContext()
        
        return result
    }
    
}
